package org.apli.haiam.admin.jsf.managed;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmAccion;
import org.apli.haiam.ejb.entidades.AdmSistema;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad AdmAccion.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfAccion extends JsfBean<AdmAccion> {

    final Logger log = LoggerFactory.getLogger(JsfAccion.class);
    private AdmSistema sistemaSeleccionado;
    private String clave;

    /**
     * Constructor por defecto.
     */
    public JsfAccion() {
        sistemaSeleccionado = new AdmSistema();
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        object = new AdmAccion();
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();
        sistemaSeleccionado = object.getAdmSistema();
        if (object.getIdAccion() == null) {

            try {
                if (!admin.existePorCampo(object.getClass(), "nombre", object.getNombre(), "admSistema", sistemaSeleccionado)) {
                    admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                    inicializar();
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));

                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Nombre ya existe", "Nombre ya existe"));
                }
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        } else {
            try {
                admin.modificar(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        }
        cargarLista();
        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
        try {
            List<AdmAccion> datos = admin.listarOrdenada(object.getClass(), "nombre", true);
            List<SelectItem> items = new ArrayList<>();
            for (AdmAccion obj : datos) {
                items.add(new SelectItem(obj, obj.getNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItem() {} ", e.getMessage());
        }
        return null;
    }

    @Override
    public String eliminarAction(AdmAccion obj) {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            sistemaSeleccionado = obj.getAdmSistema();
            admin.eliminar(obj, FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));

            cargarLista();
            context.addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.eliminar")));

        } catch (Exception e) {
            log.error("eliminarAction() {} ", e.getMessage());
            context.addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        return null;
    }

    @Override
    public void cargarLista() {
        try {
            if (object.getAdmSistema() != null) {
                sistemaSeleccionado = object.getAdmSistema();
                if (sistemaSeleccionado.getIdSistema() == null) {
                    sistemaSeleccionado = new AdmSistema();

                }
                if (sistemaSeleccionado != null && sistemaSeleccionado.getIdSistema() != null) {
                    if (sistemaSeleccionado.getIdSistema() != null) {

                        lista = admin.listarOrdenada(AdmAccion.class, "admSistema", sistemaSeleccionado, "clave", true);
                    }
                    object.setAdmSistema(sistemaSeleccionado);
                    //sistemaSeleccionado = new AdmSistema();
                }
            } else {
                lista = null;
            }
        } catch (Exception e) {
            log.error("cargarLista" + e);

        }
    }

    @Override
    public DataModel<AdmAccion> getDataModel() {
        return null;
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    public AdmSistema getSistemaSeleccionado() {
        return sistemaSeleccionado;
    }

    public void setSistemaSeleccionado(AdmSistema sistemaSeleccionado) {
        this.sistemaSeleccionado = sistemaSeleccionado;
    }

    public String getClave() {
        return clave;
    }

    public void setClave(String clave) {
        this.clave = clave;
    }

}
